/**
 * 标签服务
 * 提供标签的增删改查功能
 */

import { StorageKeys, getStorageSync, setStorageSync } from './storage.js';

/**
 * 获取所有标签
 * @returns {Array} 标签列表
 */
export function getAllTags() {
	const tags = getStorageSync(StorageKeys.TAGS, []);
	// 确保返回的是数组
	return Array.isArray(tags) ? tags : [];
}

/**
 * 根据ID获取标签
 * @param {number} id 标签ID
 * @returns {Object|null} 标签对象
 */
export function getTagById(id) {
	const tags = getAllTags();
	return tags.find(tag => tag.id === id) || null;
}

/**
 * 添加标签
 * @param {string} name 标签名称
 * @returns {Object} 新创建的标签对象
 */
export function addTag(name) {
	if (!name || name.trim() === '') {
		throw new Error('标签名称不能为空');
	}

	const tags = getAllTags();
	
	// 检查标签名称是否已存在
	const existingTag = tags.find(tag => tag.name === name.trim());
	if (existingTag) {
		throw new Error('标签名称已存在');
	}

	// 获取或初始化计数器
	let counter = getStorageSync(StorageKeys.TAG_COUNTER, 0);
	counter += 1;

	const newTag = {
		id: counter,
		name: name.trim(),
		createdAt: new Date().toISOString(),
		updatedAt: new Date().toISOString()
	};

	tags.push(newTag);

	// 保存标签列表和计数器
	setStorageSync(StorageKeys.TAG_COUNTER, counter);
	setStorageSync(StorageKeys.TAGS, tags);

	return newTag;
}

/**
 * 更新标签
 * @param {number} id 标签ID
 * @param {string} name 新标签名称
 * @returns {Object|null} 更新后的标签对象
 */
export function updateTag(id, name) {
	if (!name || name.trim() === '') {
		throw new Error('标签名称不能为空');
	}

	const tags = getAllTags();
	const tagIndex = tags.findIndex(tag => tag.id === id);

	if (tagIndex === -1) {
		throw new Error('标签不存在');
	}

	// 检查新名称是否与其他标签重复
	const existingTag = tags.find(tag => tag.name === name.trim() && tag.id !== id);
	if (existingTag) {
		throw new Error('标签名称已存在');
	}

	// 更新标签
	const updatedTag = {
		...tags[tagIndex],
		name: name.trim(),
		updatedAt: new Date().toISOString()
	};

	tags[tagIndex] = updatedTag;
	setStorageSync(StorageKeys.TAGS, tags);

	return updatedTag;
}

/**
 * 删除标签
 * @param {number} id 标签ID
 * @returns {boolean} 是否删除成功
 */
export function deleteTag(id) {
	const tags = getAllTags();
	const tagIndex = tags.findIndex(tag => tag.id === id);

	if (tagIndex === -1) {
		return false;
	}

	tags.splice(tagIndex, 1);
	setStorageSync(StorageKeys.TAGS, tags);

	return true;
}

/**
 * 批量删除标签
 * @param {Array<number>} ids 标签ID数组
 * @returns {number} 删除的标签数量
 */
export function deleteTags(ids) {
	if (!Array.isArray(ids) || ids.length === 0) {
		return 0;
	}

	const tags = getAllTags();
	const filteredTags = tags.filter(tag => !ids.includes(tag.id));
	
	const deletedCount = tags.length - filteredTags.length;
	
	if (deletedCount > 0) {
		setStorageSync(StorageKeys.TAGS, filteredTags);
	}

	return deletedCount;
}

/**
 * 更新标签顺序
 * @param {Array<number>} tagIds 按新顺序排列的标签ID数组
 * @returns {boolean} 是否更新成功
 */
export function updateTagOrder(tagIds) {
	if (!Array.isArray(tagIds)) {
		return false;
	}

	const tags = getAllTags();
	const tagMap = new Map(tags.map(tag => [tag.id, tag]));
	
	// 按照新顺序重新排列标签
	const orderedTags = tagIds
		.map(id => tagMap.get(id))
		.filter(tag => tag !== undefined);

	// 保留不在新顺序中的标签（如果有）
	tags.forEach(tag => {
		if (!tagIds.includes(tag.id) && !orderedTags.find(t => t.id === tag.id)) {
			orderedTags.push(tag);
		}
	});

	setStorageSync(StorageKeys.TAGS, orderedTags);
	return true;
}

/**
 * 初始化默认标签（如果存储为空）
 */
export function initDefaultTags() {
	const tags = getAllTags();
	if (tags.length === 0) {
		const defaultTags = [
			{ id: 1, name: '社交媒体', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() },
			{ id: 2, name: 'QQ', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() },
			{ id: 3, name: '银行卡', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() },
			{ id: 4, name: '游戏娱乐', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() }
		];
		setStorageSync(StorageKeys.TAGS, defaultTags);
		setStorageSync(StorageKeys.TAG_COUNTER, 4);
		return defaultTags;
	}
	return tags;
}
